//package com.yangxu.hospital.system.modules.system.service;
//
//import cn.hutool.core.bean.BeanUtil;
//import com.alipay.api.AlipayApiException;
//import com.alipay.api.AlipayClient;
//import com.alipay.api.AlipayConfig;
//import com.alipay.api.DefaultAlipayClient;
//import com.alipay.api.request.AlipaySystemOauthTokenRequest;
//import com.alipay.api.request.AlipayUserInfoShareRequest;
//import com.alipay.api.response.AlipaySystemOauthTokenResponse;
//import com.alipay.api.response.AlipayUserInfoShareResponse;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.yangxu.hospital.system.modules.security.config.bean.LoginProperties;
//import com.yangxu.hospital.system.modules.security.config.bean.SecurityProperties;
//import com.yangxu.hospital.system.modules.security.security.TokenProvider;
//import com.yangxu.hospital.system.modules.security.service.OnlineUserService;
//import com.yangxu.hospital.system.modules.security.service.UserDetailsServiceImpl;
//import com.yangxu.hospital.system.modules.system.domain.Role;
//import com.yangxu.hospital.system.modules.system.domain.SysPatient;
//import com.yangxu.hospital.system.modules.system.domain.User;
//import com.yangxu.hospital.system.modules.system.domain.dto.UserDto;
//import com.yangxu.hospital.system.modules.system.mapper.UserMapper;
//import com.yangxu.hospital.system.modules.system.mapper.UserRoleMapper;
//import com.yangxu.hospital.tools.utils.BarcodeAndQRCodeGenerator;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.http.ResponseEntity;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.Authentication;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.stereotype.Service;
//import javax.annotation.Resource;
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Map;
//
//@Service
//public class AlipayService {
//
//    @Autowired
//    private SecurityProperties properties;
//
//    @Value("${alipay.appid}")
//    private String appId;
//
//    @Value("${alipay.privateKey}")
//    private String privateKey;
//
//    @Value("${alipay.gateway-url}")
//    private String gatewayUrl;
//
//    @Value("${alipay.alipayPublicKey}")
//    private String alipayPublicKey;
//
//    @Autowired
//    private UserDetailsServiceImpl userDetailsService;
//
//    @Autowired
//    private TokenProvider tokenProvider;
//
//    @Resource
//    private LoginProperties loginProperties;
//
//    @Resource
//    private UserService userService;
//
//    @Resource
//    private UserMapper userMapper;
//
//    @Resource
//    private OnlineUserService onlineUserService;
//
//    @Resource
//    private UserRoleMapper userRoleMapper;
//
//    @Resource
//    private SysPatientService sysPatientService;
//
//    public ResponseEntity<?> loginWithAuthCode(String authCode) {
//        try {
//            // 初始化SDK
//            AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
//
//            // 构造请求参数以调用接口
//            AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
//            request.setCode(authCode);
//            request.setGrantType("authorization_code");
//
//            AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
//            AlipayUserInfoShareResponse aliUserInfo = getAliUserInfo(response.getAccessToken());
//
//            if (aliUserInfo == null) {
//                throw new RuntimeException("Failed to get user info from Alipay");
//            }
//
//            User user = userService.findByAlipayOpenId(aliUserInfo.getOpenId());
//
//            // 获取当前最大的 medicalCard 值
//            Long maxMedicalCard = userMapper.getMaxMedicalCard();
//            Long nextMedicalCard = maxMedicalCard + 1;
//
//            // 分配角色
//            HashSet<Role> roles = getRoles();
//
//            if (user == null) {
//                // 如果用户不存在，创建新用户
//                user = createUser(aliUserInfo, nextMedicalCard, roles);
//            } else {
//                // 如果用户已存在，更新用户信息
//                updateUser(aliUserInfo, user, roles);
//                // 是否有患者
//                SysPatient one = sysPatientService.getOne(new LambdaQueryWrapper<SysPatient>().eq(SysPatient::getPatientId, user.getId()));
//                if (one == null){
//                    // 没有患者，创建患者
//                    SysPatient sysPatient = new SysPatient();
//                    sysPatient.setPatientId(user.getId());
//                    sysPatientService.save(sysPatient);
//                }
//            }
//
//            // 生成条形码和二维码
//            String barcodeBase64 = generateBarcodeBase64(user.getMedicalCard());
//            String qrCodeBase64 = generateQRCodeBase64(user.getMedicalCard());
//
//            // 生成认证信息
//            Authentication authentication = new UsernamePasswordAuthenticationToken(user, null);
//            SecurityContextHolder.getContext().setAuthentication(authentication);
//            String token = tokenProvider.createToken(authentication);
//
//            // 返回 token 与 用户信息
//            UserDto userDto = new UserDto();
//            BeanUtil.copyProperties(user, userDto);
//            userDto.setQrCodeBase64(qrCodeBase64);
//            userDto.setBarcodeBase64(barcodeBase64);
//
//            Map<String, Object> authInfo = new HashMap<>();
//            authInfo.put("token", properties.getTokenStartWith() + token);
//            authInfo.put("user", userDto);
//
//            return ResponseEntity.ok(authInfo);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return ResponseEntity.badRequest().body("登录失败：" + e.getMessage());
//        }
//    }
//
//    private AlipayConfig getAlipayConfig() {
//        AlipayConfig alipayConfig = new AlipayConfig();
//        alipayConfig.setServerUrl(gatewayUrl);
//        alipayConfig.setAppId(appId);
//        alipayConfig.setPrivateKey(privateKey);
//        alipayConfig.setFormat("json");
//        alipayConfig.setAlipayPublicKey(alipayPublicKey);
//        alipayConfig.setCharset("UTF-8");
//        alipayConfig.setSignType("RSA2");
//        return alipayConfig;
//    }
//
//    private AlipayUserInfoShareResponse getAliUserInfo(String accessToken) throws AlipayApiException {
//        AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", "UTF-8", alipayPublicKey, "RSA2");
//        AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
//        AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken);
//        return response.isSuccess() ? response : null;
//    }
//
//    private HashSet<Role> getRoles() {
//        HashSet<Role> roles = new HashSet<>();
//        Role role = new Role();
//        role.setId(3L);
//        role.setDataScope("本级");
//        role.setLevel(3);
//        roles.add(role);
//        return roles;
//    }
//
//    private User createUser(AlipayUserInfoShareResponse aliUserInfo, Long medicalCard, HashSet<Role> roles) {
//        User user = new User();
//        user.setOpenId(aliUserInfo.getOpenId());
//        user.setNickName(aliUserInfo.getNickName());
//        user.setAvatarUrl(aliUserInfo.getAvatar());
//        user.setMedicalCard(medicalCard);
//        user.setEnabled(true);
//        user.setCreateBy("alipay");
//        userService.saveOrUpdate(user);
//        userRoleMapper.insertData(user.getId(), roles);
//        // 同步插入患者表生成患者数据
//        SysPatient sysPatient = new SysPatient();
//        sysPatient.setPatientId(user.getId());
//        sysPatientService.create(sysPatient);
//        return user;
//    }
//
//    private void updateUser(AlipayUserInfoShareResponse aliUserInfo, User user, HashSet<Role> roles) {
//        user.setNickName(aliUserInfo.getNickName());
//        user.setAvatarUrl(aliUserInfo.getAvatar());
//        user.setUpdateBy("alipay");
//        userService.saveOrUpdate(user);
//        userRoleMapper.deleteByUserId(user.getId());
//        userRoleMapper.insertData(user.getId(), roles);
//    }
//
//    private String generateBarcodeBase64(Long medicalCard) throws Exception {
//        return BarcodeAndQRCodeGenerator.generateBarcodeBase64(String.valueOf(medicalCard), 600, 100);
//    }
//
//    private String generateQRCodeBase64(Long medicalCard) throws Exception {
//        return BarcodeAndQRCodeGenerator.generateQRCodeBase64(String.valueOf(medicalCard), 400, 400);
//    }
//}